// Trie|kmp|wildCard|regexp|state machine|LL LR

// Trie

// kmp

// wildCard

// 正则

// 状态机 好好设计一下

//#region
// abcabx
// abababx

function match(string) {
  let state = start
  for (let c of string) {
    state = state(c)
  }
  return state === end
}

function start(c) {
  if (c === 'a') {
    return foundA
  } else {
    return start
  }
}
function foundA(c) {
  if (c === 'b') {
    return foundB
  } else {
    return start(c)
  }
}
function foundB(c) {
  if (c === 'a') {
    return foundA2
  } else {
    return start(c)
  }
}
function foundA2(c) {
  if (c === 'b') {
    return foundB2
  } else {
    return start(c)
  }
}
function foundB2(c) {
  if (c === 'a') {
    return foundA3
  } else {
    return start(c)
  }
}
function foundA3(c) {
  if (c === 'b') {
    return foundB3
  } else {
    return start(c)
  }
}
function foundB3(c) {
  if (c === 'x') {
    return end
  } else {
    return start(c)
  }
}
function end() {
  return end
}

console.log(match('ccc abababx ccc'))
//#endregion

// LL LR(0) LR(1) === LL(n)
// html 词法分析用状态机，emit token 后的词法分析用 LR(0) 实现
// js 四则运算用 LL 算法进行实现
// toy-js 用 LR(1) 进行了实现

// 暴力，常规办法

//#region

// 找到 ab ab
// indexOf includes for循环打标记 charAt charCodeAt
// function status(string) {
//   // return string.indexOf('ab') > -1
//   // return string.includes('ab')

//   let foundA = false;
//   for (let c of string) {
//     if (c === "a") {
//       foundA = true;
//     } else if (foundA && c == "b") {
//       return true;
//     } else {
//       foundA = false;
//     }
//   }
//   return false;
// }

// const result = status("abc cba");
// console.log(result);

// function match(string) {
//   // return string.indexOf('abcdef') > -1
//   // return string.includes('abcdef')
//   let foundA = false;
//   let foundB = false;
//   let foundC = false;
//   let foundD = false;
//   let foundE = false;

//   for (let c of string) {
//     if (c === "a") {
//       foundA = true;
//     } else if (foundA && c === "b") {
//       foundB = true;
//       foundA = false;
//     } else if (foundB && c === "c") {
//       foundC = true;
//       foundB = false;
//     } else if (foundC && c === "d") {
//       foundD = true;
//       foundC = false;
//     } else if (foundD && c === "e") {
//       foundE = true;
//       foundD = false;
//     } else if (foundE && c === "f") {
//       return true;
//     } else {
//       foundA = false;
//       foundB = false;
//       foundC = false;
//       foundD = false;
//       foundE = false;
//     }
//   }
//   return false;
// }

// // console.log(match('abcdefg'))
// //   console.log(match('aabbccddeeffgg'))
//#endregion
